package s_001_Bean_Registered;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import s_001_Bean_Registered.bean.Person;
import s_001_Bean_Registered.config.MainConfig;

/**
 * 给容器中注册组件；
 * 1）、包扫描 + 组件标注注解（@Controller/@Service/@Repository/@Component）[自己写的类]
 * 2）、@Bean[导入的第三方包里面的组件]
 * 3）、@Import[快速给容器中导入一个组件]
 * 3.1）、@Import(要导入到容器中的组件)；容器中就会自动注册这个组件，id默认是全类名
 * 3.2）、ImportSelector:返回需要导入的组件的全类名数组；
 * 3.3）、ImportBeanDefinitionRegistrar:手动注册bean到容器中
 * 4）、使用 Spring 提供的 FactoryBean（工厂Bean）;
 * 4.1）、默认获取到的是工厂 bean 调用 getObject 创建的对象
 * 4.2）、要获取工厂 Bean 本身，我们需要给 id 前面加一个 &（&colorFactoryBean）
 */
public class MainAnnTest {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Person bean = applicationContext.getBean(Person.class);
        System.out.println(bean);
        prinfBeans(applicationContext);
        ((AnnotationConfigApplicationContext) applicationContext).close();

        System.out.println("=======================================================================================");

        GenericApplicationContext genericApplicationContext = new GenericApplicationContext();
        genericApplicationContext.registerBean(MainConfig.class);
        genericApplicationContext.refresh();
        prinfBeans(genericApplicationContext);
        genericApplicationContext.registerBean(Person.class, Person::new);
        bean = (Person) genericApplicationContext.getBean("s_001_Bean_Registered.bean.Person");
        System.out.println(bean);
        genericApplicationContext.registerBean("person123", Person.class, Person::new);
        bean = (Person) genericApplicationContext.getBean("person123");
        System.out.println(bean);
        genericApplicationContext.close();
    }

    private static void prinfBeans(ApplicationContext applicationContext) {
        // 打印 IOC 容器中所有 bean 的名称
        String[] namesForType = applicationContext.getBeanDefinitionNames();
        for (String name : namesForType) {
            System.out.println(name);
        }
    }
}